// These are meant to be typed into the REPL. You can also run
// scala -Xnojline < repl-session.scala to run them all at once.
/**
  * 第4章 数据结构
  * 4.1 主要的集合特质
  * Scala 同时支持可变集合和不可变集合，不可变集合从不可变，可以安全
  * 的并发访问。
  * 两个主要的包：
  * 1) 不可变集合： scala.collection.mutable
  * 2) 可变集合： scala.collection.immutable
  * Scala 优先采用不可变集合。 集合主要分为三大类： 序列、 集、 映射。
  * 所有集合都扩展自 Iterable 特质。对于几乎所有的集合类， Scala 都同时
  * 提供了可变和不可变的版本。
  *
  *
  * Seq 是一个有先后次序的值得序列。 IndexedSeq 能够通过整形下标快速
  * 访问元素。
  * Set 是一个没有先后次序的值集合。在 SortedSort 中，元素以某种排过序
  * 的顺序被访问。
  * Map 是一组键值对偶， SortedMap 按照键的排序访问其中的实体。
  * 每个 Scala 集合特质或者类都有一个带有 Apply 方法的伴生对象（类似
  * 于静态方法） ，这个 apply 方法可以用来构建该集合中的实体
  *
  * 这样的设计叫“统一创建原则”。
  */

/**
  * 4.2 数组
  * 4.2.1 定长数组
  * 如果需要一个定长数组， 可以使用 Scala 中的 Array， Array 以 java 数组
  * 的方式实现。
  */
// 定长数组
val nums = new Array[Int](10)

val s = Array("Hello", "World")
s(0) = "Goodbye"
s

/**
  * 4.2.2 变长数组
  * 变长数组可以使用 ArrayBuffer， Java 中有 ArrayList，
  */
// 变长 数组缓冲
import scala.collection.mutable.ArrayBuffer

val b = ArrayBuffer[Int]()
val b2 = new ArrayBuffer[Int] // If you use new, the () is optional

b += 1
b += (1, 2, 3, 5)
b ++= Array(8, 13, 21)

// 删除最后5个元素
b.trimEnd(5)

b

// 在第三个位置插入6
b.insert(2, 6)
b

// 在第三个位置插入 7、8、9
b.insert(2, 7, 8, 9)
b

// 删除第三个元素
b.remove(2)
b

// 删除从第三个位置开始的3个元素
b.remove(2, 3)
b

// 变长数组与不变数组之间的转换
val a1 = b.toArray
a1.toBuffer

// 数组遍历
val a = Array(1, 1, 2, 3, 5, 8, 13, 21, 34, 55)


/**
  * Array 与 ArrayBuffer 的互转：
  * ArrayBuffer = Array.toBuffer Array = ArrayBuffer.toArray\
  */
//  下标访问   数组遍历:
for (i <- 0 until a.length)
  println(i + ": " + a(i))

// 产生一个Range
0 until a.length

// 产生一个Range，以2为间隔
0 until (a.length, 2)

// Range倒转
(0 until a.length).reverse

// a 遍历
for (elem <- a)
  println(elem)

// a 索引
for (i <- a.indices)
  println(i + ": " + a(i))
